from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtSql import *        # 我们需要使用其中的model来连接外面的数据库（SQLite）
from os.path import *            # 我们在读取文件的时候，需要知道存不存在（只要存在读取文件的操作，那么一定要判断存不存在）
import sys                       # 导入系统相关的东西


# 判断数据库文件是否存在(如果不存在数据库文件，那就返回提示信息并直接退出系统)
if not exists("student.db"):
    print("数据库文件不存在！")
    sys.exit()

# Qt数据库操作
# 1.指定连接的数据库的类型
db = QSqlDatabase.addDatabase("QSQLITE")
# 2.指定连接哪个数据库
db.setDatabaseName('student.db')
# 3.打开连接
db.open()
# 4.创建model，根据数据库创建model
model = QSqlTableModel(None, db)   # 其中需要指出两个参数的值：parent、db
# 5.SQLTableModel需要设置表，即与数据库哪张表关联
model.setTable('student')
# 6.获取数据
model.select()

# 修改表格的头（header） 而表格的头是在模型model中
# 即我们对model中的headerData进行修改，修改格式为model.setHeaderData(第几列, 布局类型, 更改名)
model.setHeaderData(0, Qt.Horizontal, '名字')
model.setHeaderData(1, Qt.Horizontal, '电话')
model.setHeaderData(2, Qt.Horizontal, '地址')

# 7.UI层面操作
app = QApplication([])
view = QTableView()
view.setModel(model)


# 接下来我们想要实现数据的添加和删除，那么我们就需要借助按钮来完成对应操作
# 添加操作的函数
def add_row():
    print(model.rowCount())    # 首先确认表格中含有多少行
    num = model.insertRows(model.rowCount(), 1)
    # 向model中的表格添加一行，添加规则是在总行数（model.rowCount()）的基础上再加一行（, 1）
    print(num)
# 窗体
dialog = QDialog()
dialog.setWindowTitle('数据库连接QT')
# 布局
layout = QVBoxLayout()
layout.addWidget(view)
# ‘添加按钮’
btn_add = QPushButton('add')
btn_add.clicked.connect(add_row)     # 设置添加按钮被触发（点击）时的触发事件（添加一行这件事）【信号和槽】
layout.addWidget(btn_add)
# ‘删除按钮’
btn_delete = QPushButton('delete')
btn_delete.clicked.connect(lambda: model.removeRow(view.currentIndex().row()))
# 说明：clicked不加括号代表一个信号，如果加了括号表示一个回调函数
# 并且这里的槽对应的函数可以使用一个lambda表达式 删除当前鼠标点击的位置的行
layout.addWidget(btn_delete)
# 将布置好的布局放入到窗体中
dialog.setLayout(layout)
# 显示窗体
dialog.show()
# 让程序循环执行
app.exec_()

# 这样也就比较容易地将数据库地数据显示在QT当中的界面上
# 注意：这里直接实现了，在QT界面当中对数据的操作，会通过代理的方式返回给数据库进行相同的操作

# 个人理解：对于数据的修改，我们直接在Qt界面内通过其提供的一个edit工具，对数据直接修改，
#  而修改后的数据会同步到model中，而model会同步到数据库中。


